﻿// owner 蒋家伟

#pragma once
#include "DataSchema_home.h"

namespace jsdk
{
    class UniqueId;
    class IElement;
    // 类别描述 ：所有需要支持C++反射的基类
    // 序列化的实例对象要直接继承于此类别
    class DATASCHEMA_EXPORT DBSchemaObject
    {
        DEFINE_DRIVER_BASE(DBSchemaObject)
    public:
        virtual ~DBSchemaObject() {}

        /// \ brief 获取当前class对应的guid
        /// \ return uid
        virtual const UniqueId& getClassId() const = 0;

        /// \ brief 获取类名称
        /// \ return 类名称
        virtual const std::wstring& getClassName() const = 0;

        /// \ 序列化
        /// \ out 序列化的流数据
        /// \ return 是否序列化成功
        virtual bool serialize(JsonDocument& jsonDoc, JsonObject& jsonObject) const = 0;

        /// \ 反序列化
        /// \ in jsonObject 反序列化的反流
        /// \ return 是否反序列化成功
        virtual bool unserialize(const JsonObject& jsonObject) = 0;

        /// \ brief 返回对象所属的Element，如果返回空指针则不会触发ElementChanged事件
        /// \ return IElement
        virtual const IElement* getTopLevelElement() const { return nullptr; };
    };
}
